#include <iostream>

using namespace std;
using ll=long long;
const int N=5*1e5+10;
struct node{
	int l,r;
	ll sum,v;
}tr[N*4];
ll a[N];
int n,m;
ll _gcd(ll x,ll y)
{
	return y==0?x:_gcd(y,x%y);
}
void pushup(node& u,node& l,node& r)
{
	u.sum=l.sum+r.sum;
	u.v=_gcd(l.v,r.v);
}

void pushup(int u)
{
	pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}

void build(int u,int l,int r)
{
	if(l==r)
	{
		tr[u]={l,r,a[r]-a[r-1],a[r]-a[r-1]};
	}
	else{
		tr[u]={l,r};
		int mid=l+r>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
void modify(int u,int x,ll d)
{
	if(tr[u].l==x && tr[u].r==x)
	{
		ll t=tr[u].sum+d;
		tr[u]={x,x,t,t};
	}
	else{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid)
		{
			modify(u<<1,x,d);
		}
		else{
			modify(u<<1|1,x,d);
		}
		pushup(u);
	}
}
node query(int u,int l,int r)
{
	if(tr[u].l>=l && tr[u].r<=r)
		return tr[u];
	int mid=tr[u].l+tr[u].r>>1;
	if(r<=mid)
	{
		return query(u<<1,l,r);
	}
	else if(l>mid)
	{
		return query(u<<1|1,l,r);
	}
	else{
		auto left=query(u<<1,l,r);
		auto right=query(u<<1|1,l,r);
		node ret;
		pushup(ret,left,right);
		return ret;
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	
	while(m--)
	{
		char op[2];
		int l,r;
		scanf("%s%d%d",op,&l,&r);
		if(*op=='C')
		{
			ll d;
			scanf("%lld",&d);
			modify(1,l,d);
			if(r+1<=n)
				modify(1,r+1,-d);
		}
		else{
			auto left=query(1,1,l);
			node right({0,0,0,0});
		
			if(l+1<=r)
				right=query(1,l+1,r);
			cout<<abs(_gcd(left.sum,right.v))<<endl;
		}
	}
	return 0;
}
